#include <iostream>
#include <sys/iofunc.h>
#include <sys/dispatch.h>
#include <errno.h>
#include <vector>
#include <unistd.h>
#include <math.h>
#include <time.h>
#include "packet.h"
#include "samolot.h"

#define ATTACH_POINT "database"

using namespace std;

int main(void){

    srand( (unsigned)time( NULL ) ); 
    
	packet_t msg;
	packet_t reply;

//	Samolot sam(80,150); //pozycja samolotu ;D
	Samolot sam; 	//pozycja samolotu losowana na brzegu mapy
    punkt DoceloweLotnisko;


// pobrac dane o samolocie z bd
	int fd, rcvid, chid;
	int id_mapa = 234;
	
	if ((fd = name_open(ATTACH_POINT, NAME_FLAG_ATTACH_GLOBAL)) == -1) {
		cerr << "Nie mozna poalczyc sie z baza danych.";
    }

    msg.hdr.type = 0x00;

    // Do whatever work you wanted with server connection 
	msg.type = PACKET_AIRPLANE_TYPE_GET;
	MsgSend(fd, &msg, sizeof(msg), &reply, sizeof(reply));
	cout<<"Otrzymalem samolot o nazwie: "<< reply.samolot_typ.nazwa<<" " << reply.samolot_typ.pasazerowie_max<<" " <<reply.samolot_typ.bak_max<<endl;

	sam.samolot_typ_id = reply.samolot_typ.samolot_typ_id;
	sam.zasieg_max = reply.samolot_typ.zasieg_max;
	sam.bak_max = reply.samolot_typ.bak_max; 		
	sam.pasazerowie_max = reply.samolot_typ.pasazerowie_max;
	sam.dlugosc_pasa = reply.samolot_typ.dlugosc_pasa;
	sam.czas_startu = reply.samolot_typ.czas_startu;
	sam.czas_ladowania = reply.samolot_typ.czas_ladowania;
	sam.predkosc_max  = reply.samolot_typ.predkosc_max;
	sam.nazwa  = reply.samolot_typ.nazwa; 
	
    // Close the connection 
    name_close(fd);
	




	
    
    cout << sam.Pozycja.x << " " << sam.Pozycja.y << endl;

	sam.PobierzListeLotnisk(); //lista uaktualniona w obiekcie samolotu - lista z bd
	    


/********************************************************************* */

    lotnisko_t lotnisko = sam.LosujLotnisko(sam.lista_lotnisk);						// losowanie docelowego lotniska 
//    lotnisko_t lotnisko = sam.lista_lotnisk[0];
	lotnisko_t lotnisko_temp;   
    DoceloweLotnisko.x = round((float)((lotnisko.x_o + lotnisko.x_k)/2));		//Docelowe lotnisko (wspx , wspy);
    DoceloweLotnisko.y = round((float)((lotnisko.y_o + lotnisko.y_k)/2));
    
    cout << "Docelowe lotnisko : '"<< lotnisko.nazwa << "'\t\t wspolrzedne ( " << DoceloweLotnisko.x << " ; "<< DoceloweLotnisko.y <<  " ) " << endl;
	
	cout.setf(ios::fixed, ios::floatfield);
	cout.precision(3);
	

	// LECE :D
	while(1){
		
       sam.Pozycja = sam.LecDo(sam.Pozycja,DoceloweLotnisko,19);
		
       float odl = sam.OdlegloscOd(DoceloweLotnisko);

		
       if (  odl < 10 ){
       // jestem u was prosze o ladowanie
       	 cout << "Prosze o ladowanie... :D" << endl;
       	    
			// opakowanie
			
		//moge ladowac?? wysylam zasieg.. ew. awarie
		// msg.type = 78; == > chce ladowac;
		// jaki mam zasieg....
		
			// nie moge awaria
			
			// moge
				// stan := laduje....
				// uspienie na jakis czas... => potem chec startu
			// musze czekac ...
				// za dlugo??
					//jesli tak to lec na najblizsze lotnisko...
					//jesli nie to czekac...
     	 break;

       	 }
       	 else		
       	 {
	       if (  odl < 100 ){
    	   	 cout << "Strefa powietrzna docelowego lotniska" << endl;
	
      		 // wyslac moje x,y i T ze bede chcial ladowac ;
      		 


       	   	}

       	   else {
	       lotnisko_temp = sam.KtoreLotniskoObsluguje(100); 		//obsluguje mnie lotnisko parametr - odl od tego lotniska
	       cout << "Obsluguje mnie lotnisko '" << lotnisko_temp.nazwa << "' ";

	       // msg jestem u was x,y i F -jestem przelotem

	      }
	   }
	      
        cout << endl <<endl;
   		cout << "Moja rzeczywista pozycja : ( " << sam.Pozycja.x << " ; " << sam.Pozycja.y << ")";
		cout << "\t\t Pozycja dla mapy : ( " << sam.getX() << " ; " <<sam.getY() << " )" << endl;;

		// do mapy wyslac wspolrzedne x, y  (sam.getX(),   sam.getY() )
		
		// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!111 do mapy
				int wspolrzedne[2] = { sam.getX() , sam.getY() };
				float wsp_awarii;
				MsgSend(id_mapa, &wspolrzedne, sizeof(wspolrzedne), &wsp_awarii, sizeof(wsp_awarii) ) ; 
	
      sleep(1);
    }
    cout <<sam.Pozycja.x << " " << sam.Pozycja.y << endl;
    
/* */    

}
